package com.ccc.scala.base5_function

object Function8_ {
  def main(args: Array[String]): Unit = {
    // 闭包
    // 一个函数使用了外部变量，把这个变量包含到了它的内部来使用，改变了这个变量的声明周期
    // 将当前的代码形成了一个闭合的环境，这个环境称之为闭包环境，简称闭包

    def outer(a: Int) = {
      def inner(b: Int): Int = {
        a + b
      }
      inner _
    }

    // 内部函数在外部使用的时候会有闭包
    println(outer(10)(20)) // 30

    // 将函数作为对象使用时
    val f = outer(10)
    val ff = f(20)
    println(ff) // 30

    // 所有匿名函数都有闭包


    // Scala2.12版本之前闭包功能采用的是匿名函数类型实现
    // Scala2.12版本闭包功能采用的是更改函数声明实现
    // 通过编译之后产生的字节码可以得知

  }
}
